package com.ftg.learn.chapter02;


/**
 * 学习位运算
 *
 * @author kangjx
 * @version 1.0
 * @date 2023/4/15 上午9:20
 */
public class LearnOptions03 {

    public static void main(String[] args) {
        //正整数 有符号与无符号右移是相同
        System.out.println(3 >>> 1);
        System.out.println(3 >> 1);

        //符号位不变，数值位按位取反,末位再加1  补码
        // 反码  原始按位取反
//        补码转换为原码：符号位不变，数值位按位取反,末位再加1，即补码的补码等于原码
        // -15 原始
//        7 6 5 4 3 2 1 0
//        1 0 0 0 1 1 1 1  原始
//        1 1 1 1 0 0 0 1  补码
//        >> 有符号右移
//        去掉右侧2位，左侧用1补2位
//        11111100 -15 右移2位以后的补码
//        符号位不变,补码转换成原码  取反+1
//        11111100
//          10000100  运算完成以后的原码  -4

        //10001111
        //补码
        //11110001 >> 2 = 11111100

        //负数
        // 10000011  原码
        // 11111101  补码
//        -3 >>>1
        System.out.println(-3 >> 1);
        //10000011 原码
        //11111101 补码
        //11111110  补码右移一位
        //10000010 -2


        //10000011
        //无符号的负数右移  (符号位参与运算)
        System.out.println(-3 >>> 1);
        //10000011  原码
        //11111101  补码
        //0111110
        System.out.println(Integer.MAX_VALUE);

        System.out.println(2 & 3);
//        10
//     &  11

//10000
//00111
//        System.out.println(7 ^ 7);
//        & 相同位数同时为1  则为1
//        | 相同位数有一个为1  则为1
//        ^ 相同位数不相同为1 相同为0


//        System.out.println(~2);
        System.out.println(~12);

        int a = 9;
//        && 短逻辑与  一假为假 全真为真
//        ||  短逻辑或 一真为真
//        |

        System.out.println(a++ > 3 || a++ > 4);

        System.out.println(a);

        short ashort = 1;
        //懒人模式
        ashort += 1;

        ashort -= 1;
        ashort *= 1;
        ashort /= 1;

        int aint = 8;

        aint |= 3;
        aint &= 3;
        aint ^= 3;
        System.out.println(aint);

        aint %= 2;
        System.out.println(aint);

//        Integer.valueOf("1"+ 1+ 1) - Integer.valueOf("1"+ 1)
        System.out.println(2 + "3");
        System.out.println(Integer.valueOf("1" + 1 + 1) - Integer.valueOf("1" + 1));
        byte n = -1;//1000000000001
        byte m = 1;

        System.out.println(n >>> m);

//        1 2 3 2 1
//          1 2 3 4 5
//            1 2 3 6-4 6-5


    }

}
